package org.kalai.unifypay.daemon;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import org.apache.log4j.Logger;
import org.kalai.unifypay.bean.Transflow;
import org.kalai.unifypay.mins.MinsPay;
import org.kalai.unifypay.servlet.MinsNotify;
import org.kalai.unifypay.util.DataDao;
import org.kalai.unifypay.util.DateUtil;

/**
 * 交易中的订单与民生银行核实监听
 * 
 * @author zsl-2016年9月24日
 *
 */
@WebListener
public class TradeVerifyListener implements ServletContextListener {

   private static final Logger logger  = Logger.getLogger(TradeVerifyListener.class);

   private static final long   repunit = 20*60 * 1000;

   @Override
   public void contextDestroyed(ServletContextEvent arg0) {
      logger.info("交易中的订单与民生银行核实监听停止。");
   }

   @Override
   public void contextInitialized(ServletContextEvent arg0) {
      logger.info("交易中的订单与民生银行核实监听开始...");
      new Timer().schedule(new TimerTask() {

         @Override
         public void run() {
            Map<String, Object> resultMap=new HashMap<String, Object>();
            try {
               /* 获取前20分钟与40分钟交易中的订单 */
               List<Transflow> transflowList = DataDao.getInstance().getTransflowList(DateUtil.addMinute(new Date(), -40),DateUtil.addMinute(new Date(), -20));
               logger.info("交易中的订单与民生银行核实捞取到:" + transflowList.size());
               for (Transflow transflow : transflowList) {
                  // 与民生银行核实交易订单
                  resultMap= MinsPay.transQuery(transflow.getTranxSN(), transflow.getTranxSN());

                  if (resultMap == null) {
                     // 修改订单状态为异常[后续需技术人员排查问题]
                     DataDao.getInstance().updateTransflowStatus(transflow.getTranxSN(), -1);
                     continue;
                  }
                  if("R".equals(resultMap.get("oriRespType"))||"200001".equals(resultMap.get("respCode")))
                  {
                     continue;
                  }
                  new MinsNotify().notifyManage(transflow, resultMap);
               }
            } catch (Exception e) {
               logger.error( String.format("%s交易中的订单与民生银行核实监听异常:%s",resultMap,e));
            }
         }
      }, repunit, repunit);
   }
}
